//
//  OAuthViewController.swift
//  HMWeiboBySwift
//
//  Created by wuxl on 15/6/25.
//  Copyright © 2015年 heima. All rights reserved.
//

import UIKit
import SVProgressHUD
import AFNetworking

class OAuthViewController: UIViewController,UIWebViewDelegate {
    // 0. 定义常量
    private let WB_Client_ID = "3984965544"
    private let WB_Redirect_URI = "http://www.baidu.com"
    private let WB_App_Secret = "f561dfbc5cc153d20c740ebf5088edad"
    
    // 1. webView 加载授权页面
    var webView: UIWebView?
    
    override func loadView() {
        webView = UIWebView()
        // 这里的 '?' 表示 webView 是 optional(可选的)
        webView?.delegate = self
        
        // 根视图就是 webView
        view = webView
        
        // 设置 nav 的信息
        title = "新浪微博"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "关闭", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
    }
    
    // 关闭当前窗口
    func close() {
        SVProgressHUD.dismiss()
        
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 加载授权页面
        loadOAuthPage()
    }
    
    // 加载授权页面
    private func loadOAuthPage() {
        let urlString = "https://api.weibo.com/oauth2/authorize?client_id=\(WB_Client_ID)&redirect_uri=\(WB_Redirect_URI)"
    
        // ! 表示一定可以生成
        let url = NSURL(string: urlString)!
        
        webView?.loadRequest(NSURLRequest(URL: url))
    }
    
    // MARK: - UIWebViewDelegate
    // 在 iOS 的开发中，如果代理方法返回 true，表示一切正常，如果返回 false，表示什么也不做
    
    /**
    初始：用户刚一点击登录按钮的时候访问的地址
    URL--->https://api.weibo.com/oauth2/authorize?client_id=3984965544&redirect_uri=http://www.baidu.com
    登录成功：
    URL--->https://api.weibo.com/oauth2/authorize
    授权成功，得到授权码 code
    URL--->https://www.baidu.com/?code=fe8d00e6d82356f72d6bd87bad342981
    取消授权：
    URL--->https://www.baidu.com/?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330
    
    得到令牌：
    "access_token" = "2.00FvdrLDoZVg2E87ff4cfa953wyChD";
    
    通过令牌获取个人信息
    https://api.weibo.com/2/users/show.json?access_token=2.00FvdrLDoZVg2E87ff4cfa953wyChD&uid=2923723031
    1> 如果是新浪微博的 URL，就继续加载
    2> 如果是回调地址，需要根据 URL 中的内容，判断是否有授权码
    */
    
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
   
        // 0. URL 的完整字符串
        let urlString = request.URL!.absoluteString
        print("")
        print("URL--->"+urlString)
        
        
        // 1. 如果不是回调的 URL,就继续加载
        if !urlString.hasPrefix(WB_Redirect_URI) {
            print("返回的不是回调地址，需要继续加载--->")
            return true
        }
        
        // 2. 如果是回调地址，需要根据 URL 中的内容，判断是否有授权码
        print("返回回调地址，需要判断--->")
        // 2.1 获取请求 URL 中的查询字符串
        let query = request.URL!.query!
        let codeStr = "code="
        
        // 取的是字节长度，如果是中文就不正确了
//        let fromLen = codeStr.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
        
        // 2.2 判断查询字符串中是否包含 codeStr，来获取授权码
        if query.hasPrefix(codeStr) {
            let code = (query as NSString).substringFromIndex((codeStr as NSString).length)
            print("")
            print("获取授权码---> \(code)")
            
            loadAccessToken(code)
        } else {
            print("")
            print("query 中不包含 code=")
            print("取消授权")
            close()
        }
        
        return true
    }
    
    func webViewDidStartLoad(webView: UIWebView) {
        SVProgressHUD.showInfoWithStatus("正在玩命加载中。。。")
    }
    
    func webViewDidFinishLoad(webView: UIWebView) {
        SVProgressHUD.dismiss()
    }
    
    ///	使用授权码加载令牌(token)
    ///	:param: code	授权码
    private func loadAccessToken(code: String) {
        // 1. urlString
        /*
        苹果要求 SSL 必须是 1.2 版本及以上，但是现在网络上很多都是 1.1
        SSL(Secure Sockets Layer 安全套接层) 
        */
        // https://api.weibo.com/oauth2/access_token?
        let urlString = "oauth2/access_token"
        
        // 2. 请求参数
        /*
        必选	类型及范围	说明
        client_id       true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type      true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        code            true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        */
        let params = [
            "client_id": WB_Client_ID,
            "client_secret": WB_App_Secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": WB_Redirect_URI
        ]
  
        // 3. 发起网络请求
        NetworkTools.sharedNetworkTools().POST(urlString, parameters: params, success: { (_, JSON) -> Void in
            print(JSON)
            
            // 字典转模型 -> 加载用户信息，链式调用
            UserAccount(dict: JSON as! [String: AnyObject]).loadUserInfo{ (account, error) -> () in
                // 判断帐户信息是否正确
                if account != nil {
                    print("网络加载account打印信息")
                    print(account)
                    
                    // 1. 设置全局的 account
                    sharedUserAccount = account
                    
                    // 2. 发送通知
                    // object = false 表示显示 WelcomeViewController
                    NSNotificationCenter.defaultCenter().postNotificationName(HMSwitchRootVCNotification, object: false)
                    
                    // 3. 关闭当前控制器
                    self.close()
                    
                    return
                }
                
                print(error)
                SVProgressHUD.showInfoWithStatus("您的网络不给力")
            }
            
            // 归档保存
//            account.saveAccount()
            
            }) { (_, error) -> Void in
                print(error)
        }
    }
    
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}
